﻿using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows;
using YLClient.Util;
using YLClient.YLServiceClient;
using YLPublicService.TransferModel;
using System.Linq;
using System.IO;
using System.Threading;
using YLPublicService.EnumExtension;


namespace YLClient.Froms
{
    public partial class NewItem : Window
    {

        //Task worker;
        void AddWorkItem(WorkItem wi, string[] files)
        {
            var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
            WorkFlow wf = new WorkFlow(wi, files, this);

            #region 开始时处理
            wf.Started += p =>
            {
                var t = new Task(() =>
                {
                    progressBar.Visibility = Visibility.Visible;
                });
                t.Start(scheduler);
                t.Wait();
            };
            #endregion

            #region 遇到错误时处理
            int errRetryCount = 3;
            wf.ErrorContinueAt += processPoint =>
            {
                errRetryCount--;
                if (errRetryCount < 0)
                {
                    return false;
                }
                return true;
            };
            #endregion

            #region 状态改变是处理
            wf.StatusChange += status =>
            {
                Task t = new Task(
                    () =>
                    {
                        txtbStatus.Text = status.TryGetEnumMemberValue();
                    }
                 );
                t.Start(scheduler);
                t.Wait();
            };
            #endregion

            #region 结束时处理
            wf.Finished += p =>
            {
                Task t = new Task(() =>
                {
                    progressBar.Visibility = Visibility.Hidden;
                });
                t.Start(scheduler);
                t.Wait();
            };
            #endregion
            var worker = new Task(() => wf.Start());
            worker.Start();
        }
        private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            #region 验证数据完整性
            if (false == checkAllValue()) //判断信息是否填写完毕
            {
                MessageBox.Show("请完善信息！", "提示");
                return;
            }
            #endregion

            #region 数据初始化
            //将要上传的文件名字列表
            var files = GetUploadFiles();
            errorFiles.Clear();
            //工作项初始化
            var t = tm.templates[cmbTemplateName.SelectedIndex];
            initialTemplateInstance(t);
            WorkItem item = BuildWorkItem(t);
            #endregion

            AddWorkItem(item, files);
        }

        private WorkItem BuildWorkItem(TemplateItem t)
        {
            WorkItem item = new WorkItem();
            item.TemplateID = Convert.ToInt32(t.mID);
            item.TemplateName = t.mTemplateDetial.mName;
            item.Detial = t.mTemplateDetial.ToString();

            return item;
        }
        #region 旧代码
        //dynamic work(workFlowStatus status, params dynamic[] argument)
        //{
        //    return true;
        //}
        //internal enum workFlowStatus
        //{
        //    WaitStart,
        //    AddWorkItemToDBing,
        //    AddWorkItemToDBerr,

        //    UploadFileToFTPing,
        //    UploadFileToFTPerr,

        //    SetFinishStatusToDBing,
        //    SetFinishStatusToDBerr,
        //    SetFinishStatusToDBed
        //}
        //internal class NewItemWorkFlow
        //{
        //    List<Task> workList = new List<Task>();
        //    public workFlowStatus Status = workFlowStatus.WaitStart;
        //    public delegate dynamic Work(workFlowStatus status, params  dynamic[] argument);
        //    public Work work;
        //    public void Start(WorkItem workItem, List<string> uploadFiles, TaskScheduler scheduler)
        //    {
        //        ServiceClient client = ServiceClient.GetServiceClient();

        //        try
        //        {
        //            Status = workFlowStatus.AddWorkItemToDBing;
        //            dynamic ret = work(Status, workItem);
        //        }
        //        finally
        //        {
        //            Status = workFlowStatus.AddWorkItemToDBerr;
        //            work(Status, workItem);
        //        }

        //        if (pret.Result == true)
        //        {
        //            try
        //            {
        //                Status = workFlowStatus.UploadFileToFTPing;
        //                work(Status, workItem);
        //            }
        //            finally
        //            {
        //                Status = workFlowStatus.UploadFileToFTPerr;
        //                work(Status, workItem);
        //            }
        //        }
        //        else
        //        {
        //            Status = workFlowStatus.AddWorkItemToDBerr;
        //            work(Status, workItem);
        //        }

        //        try
        //        {
        //            Status = workFlowStatus.SetFinishStatusToDBing;
        //            work(Status, workItem);
        //        }
        //        finally
        //        {
        //            Status = workFlowStatus.SetFinishStatusToDBerr;
        //            work(Status, workItem);
        //        }

        //        //第一步
        //        //var t1 =
        //        //    new Task<bool>(
        //        //        o =>
        //        //        {
        //        //            try
        //        //            {
        //        //                Status = workFlowStatus.AddWorkItemToDBing;
        //        //                return work(Status, workItem);
        //        //            }
        //        //            finally
        //        //            {
        //        //                Status = workFlowStatus.AddWorkItemToDBerr;
        //        //                work(Status, workItem);
        //        //            }
        //        //        }
        //        //        , scheduler);

        //        ////第二步
        //        //var t2 = t1.ContinueWith(
        //        //    pret =>
        //        //    {
        //        //        if (pret.Result == true)
        //        //        {
        //        //            try
        //        //            {
        //        //                Status = workFlowStatus.UploadFileToFTPing;
        //        //                work(Status, workItem);
        //        //            }
        //        //            finally
        //        //            {
        //        //                Status = workFlowStatus.UploadFileToFTPerr;
        //        //                work(Status, workItem);
        //        //            }
        //        //        }
        //        //        else
        //        //        {
        //        //            Status = workFlowStatus.AddWorkItemToDBerr;
        //        //            work(Status, workItem);
        //        //        }
        //        //    }
        //        //    , CancellationToken.None
        //        //    , TaskContinuationOptions.OnlyOnRanToCompletion
        //        //    , scheduler);
        //        ////第三步
        //        //var t3 = t2.ContinueWith(
        //        //    pret =>
        //        //    {
        //        //        try
        //        //        {
        //        //            Status = workFlowStatus.SetFinishStatusToDBing;
        //        //            work(Status, workItem);
        //        //        }
        //        //        finally
        //        //        {
        //        //            Status = workFlowStatus.SetFinishStatusToDBerr;
        //        //            work(Status, workItem);
        //        //        }
        //        //    }
        //        //    , CancellationToken.None
        //        //    , TaskContinuationOptions.OnlyOnRanToCompletion
        //        //    , scheduler
        //        //    );
        //    }
        //} 
        #endregion
    }

}
